home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / tt / back_up / img_back.lst < prev    next >
Encoding:
File List  |  1996-09-18  |  13.9 KB  |  461 lines

  1. vers$=" IMG_BACK.GFA, Version 0/o3, 13.Febr.91,  8 Uhr, Pfr.S.Just,Kirchweg 5,6936 Haag, GFABasic 3.5E, ATARI-TT, 1280*960, FastLoad,FastCode,FastMem, *Public Domain* "
  2. '
  3. @init
  4. @partitions_daten
  5. @default_part
  6. @main
  7. @schluss
  8. END
  9. '
  10. > PROCEDURE init
  11.   LOCAL i%
  12.   esc$=CHR$(27)
  13.   inv$=esc$+"p"
  14.   norm$=esc$+"q"
  15.   cltoeop$=esc$+"J"
  16.   cltoeol$=esc$+"K"
  17.   cur_on$=esc$+"e"
  18.   cur_off$=esc$+"f"
  19.   beep$=CHR$(7)
  20.   '
  21.   mode_read&=2
  22.   mode_write&=3
  23.   '
  24.   SPOKE &H444,0 ! Kein Verify!
  25.   '
  26.   DIM bpb&(8),dbpb&(8)
  27.   bpb%=VARPTR(bpb&(0))
  28.   drives&=15
  29.   DIM sect_size_b&(drives&),clust_size_s&(drives&),clust_size_b&(drives&),root_size_s&(drives&),fat_size_s&(drives&),fat2_sect&(drives&),dat_sect&(drives&)
  30.   DIM dat_clust_anz&(drives&),fat_size_bit&(drives&),root_sect&(drives&),part_free%(drives&),part_verbrauch%(drives&),disketten&(drives&)
  31.   '
  32.   bpb_bezs&=12
  33.   DIM bpb_bez$(bpb_bezs&+1)
  34. bpb_bez:
  35.   DATA "SectSizeB","ClustSizeS","ClustSizeB","DirSizeS","FATSizeS","FAT2Sect","DatSect1","DatClustAnz","FATSizeBit","DirSect","ClustFree","ClustFull","Disks"
  36.   RESTORE bpb_bez
  37.   FOR i%=0 TO bpb_bezs&
  38.     READ bpb_bez$(i%)
  39.     bpb_bez$(i%)=LEFT$(bpb_bez$(i%)+"           ",11)
  40.   NEXT i%
  41.   '
  42.   drv_map%=3 ! A: und B:
  43.   drv_map$="AB"
  44.   last_drv%=1 ! B:
  45.   '
  46.   disk_drv%=1 ! B:
  47.   disk_drv$="B"
  48.   part_drv%=2 ! C:
  49.   part_drv$="C"
  50.   '
  51.   ' IMAGE der ersten 18 Sektoren einer 726016-Diskette nach der Formatierung
  52.   INLINE disk_anfang%,9216
  53.   INLINE invert%,16
  54.   soft_format!=TRUE
  55.   ' FAT-Buffer
  56.   DIM fat_bufs|(32767)
  57.   fat_buf%=VARPTR(fat_bufs|(0))
  58.   ' 256K-Kopierbuffer
  59.   DIM kop_bufs|(256*1024-1)
  60.   kop_buf%=VARPTR(kop_bufs|(0))
  61.   '
  62.   ' Copyright
  63.   ' CLS
  64.   PRINT AT(1,1);inv$;vers$;norm$;
  65.   DEFMOUSE 0
  66.   ' Schnell blinkender Cursor
  67.   VOID XBIOS(21,2,-1)
  68.   VOID XBIOS(21,4,20)
  69. RETURN !init
  70. > PROCEDURE partitions_daten
  71.   LOCAL i%,j%,k%,s%
  72.   PRINT
  73.   PRINT " ";inv$;" Ihre Festplatte: ";norm$
  74.   s%=CRSLIN
  75.   drv_map%=BIOS(10)
  76.   j%=1
  77.   FOR k%=0 TO bpb_bezs&
  78.     PRINT AT(1,s%+k%+1);bpb_bez$(k%);":";
  79.   NEXT k%
  80.   FOR i%=2 TO drives&
  81.     IF BTST(drv_map%,i%) THEN
  82.       drv_map$=drv_map$+CHR$(65+i%)
  83.       j%=i%
  84.       BMOVE BIOS(7,i%),bpb%,18
  85.       sect_size_b&(i%)=bpb&(0)
  86.       clust_size_s&(i%)=bpb&(1)
  87.       clust_size_b&(i%)=bpb&(2)
  88.       root_size_s&(i%)=bpb&(3)
  89.       fat_size_s&(i%)=bpb&(4)
  90.       fat2_sect&(i%)=bpb&(5)
  91.       dat_sect&(i%)=bpb&(6)
  92.       dat_clust_anz&(i%)=bpb&(7)
  93.       fat_size_bit&(i%)=bpb&(8)
  94.       root_sect&(i%)=fat2_sect&(i%)+fat_size_s&(i%)
  95.       part_free%(i%)=DFREE(i%+1) DIV clust_size_b&(i%)
  96.       part_verbrauch%(i%)=dat_clust_anz&(i%)-part_free%(i%)-2
  97.       disketten&(i%)=part_verbrauch%(i%) DIV 711
  98.       IF (part_verbrauch%(i%) MOD 711)>0 THEN
  99.         INC disketten&(i%)
  100.       ENDIF
  101.       PRINT AT((i%-2)*7+13,s%);CHR$(i%+65);":\"
  102.       FOR k%=0 TO 8
  103.         PRINT AT((i%-2)*7+13,s%+k%+1);bpb&(k%);
  104.       NEXT k%
  105.       PRINT AT((i%-2)*7+13,s%+10);root_sect&(i%);
  106.       PRINT AT((i%-2)*7+13,s%+11);part_free%(i%);
  107.       PRINT AT((i%-2)*7+13,s%+12);part_verbrauch%(i%);
  108.       PRINT AT((i%-2)*7+13,s%+13);disketten&(i%);
  109.     ENDIF
  110.   NEXT i%
  111.   last_drv%=j%
  112.   PRINT
  113. RETURN ! partitions_daten
  114. > PROCEDURE default_part
  115.   ' BPB der Partition einlesen
  116.   BMOVE BIOS(7,part_drv%),bpb%,18
  117.   ' FAT der Partition einlesen
  118.   IF BIOS(4,mode_read&,L:fat_buf%,fat_size_s&(part_drv%),fat2_sect&(part_drv%),part_drv%)<>0 THEN
  119.     ALERT 3,"Verzeichnis|von Partition "+part_drv$+":\|unleserlich! ",1,"WEITER",dummy%
  120.   ENDIF
  121. RETURN ! default_part
  122. '
  123. > PROCEDURE main
  124.   LOCAL w$,a$
  125.   PRINT
  126.   PRINT cltoeol$
  127.   men_y%=CRSLIN
  128.   PRINT cltoeol$
  129.   PRINT cltoeol$
  130.   DO
  131.     PRINT AT(1,men_y%);cltoeol$;" ";inv$;"L";norm$;"aden VON Disk, ";
  132.     PRINT inv$;"S";norm$;"peichern AUF Disk, ";
  133.     PRINT inv$;"P";norm$;"artition wählen(";part_drv$;"), ";
  134.     PRINT inv$;"D";norm$;"iskettenlaufwerk wählen(";disk_drv$;"), ";
  135.     PRINT inv$;"I";norm$;"nvertieren, ";
  136.     PRINT "E";inv$;"x";norm$;"it ";
  137.     PRINT cur_on$;
  138.     w$=UPPER$(CHR$(EVNT_KEYBD()))
  139.     PRINT cur_off$;cltoeol$
  140.     EXIT IF w$="X"
  141.     SELECT w$
  142.     CASE "I" ! Invertieren
  143.       ~C:invert%(L:XBIOS(2),L:153600 DIV 4)
  144.     CASE "L" ! Laden VON Disk
  145.       @disk_to_hard
  146.     CASE "S" ! Speichern AUF Disk
  147.       @hard_to_disk
  148.     CASE "P" ! Partition waehlen
  149.       PRINT AT(1,men_y%);cltoeol$;" Wählen Sie Ihre Partition: ";cur_on$;
  150.       a$=UPPER$(CHR$(EVNT_KEYBD()))
  151.       PRINT cur_off$;cltoeol$
  152.       IF INSTR(drv_map$,a$) THEN
  153.         part_drv$=a$
  154.         part_drv%=ASC(a$)-65
  155.         ' BPB der Partition einlesen
  156.         BMOVE BIOS(7,part_drv%),bpb%,18
  157.         ' FAT der Partition einlesen
  158.         IF BIOS(4,mode_read&,L:fat_buf%,fat_size_s&(part_drv%),fat2_sect&(part_drv%),part_drv%)<>0 THEN
  159.           ALERT 3,"Verzeichnis|von Partition "+part_drv$+":\|unleserlich! ",1,"WEITER",dummy%
  160.         ENDIF
  161.       ELSE
  162.         ALERT 3," Partition "+a$+":\|nicht vorhanden!",1,"WEITER",dummy%
  163.       ENDIF
  164.     CASE "D" ! Diskettenlaufwerk waehlen
  165.       PRINT AT(1,men_y%);cltoeol$;" Wählen Sie das Datensicherungslaufwerk A oder B: ";cur_on$;
  166.       a$=UPPER$(CHR$(EVNT_KEYBD()))
  167.       PRINT cur_off$;cltoeol$
  168.       IF a$="A" THEN
  169.         disk_drv$=a$
  170.         disk_drv%=0
  171.       ENDIF
  172.       IF a$="B" THEN
  173.         disk_drv$=a$
  174.         disk_drv%=1
  175.       ENDIF
  176.     CASE "X" ! E-x-it
  177.       ' Niemals
  178.     DEFAULT
  179.       ALERT 3,"Kommando '"+w$+"'|Unbekannt!",1,"WEITER",dummy%
  180.     ENDSELECT
  181.   LOOP
  182. RETURN ! main
  183. '
  184. > PROCEDURE hard_to_disk
  185.   LOCAL gebraucht%,diskette%,t$,d$,cl%,fehler!,dfrei%,info$,w$,header$,fadr%,fwert%,offset%,fkt%,sect%,dat$
  186.   '
  187.   PRINT AT(1,men_y%);cltoeol$;" '726016-Disketten' in ";disk_drv$;": jeweils Löschen vorher? ['n',...] ";cur_on$;
  188.   IF UPPER$(CHR$(EVNT_KEYBD()))="N" THEN
  189.     soft_format!=FALSE
  190.   ELSE
  191.     soft_format!=TRUE
  192.   ENDIF
  193.   PRINT cur_off$;cltoeol$
  194.   '
  195.   diskette%=0
  196.   t$=TIME$
  197.   d$=DATE$
  198.   cl%=2
  199.   offset%=dat_sect&(part_drv%)
  200.   fkt%=clust_size_s&(part_drv%)
  201.   fadr%=fat_buf%+hd_start%*2
  202.   fwert%=BYTE{fadr%}+256*BYTE{fadr%+1}
  203.   gebraucht%=0
  204.   fehler!=FALSE
  205.   '
  206.   IF NOT fehler! THEN
  207.     DO
  208.       '
  209.       ' Naechste Diskette mit Abbruch-Moeglichkeit
  210.       INC diskette%
  211.       PRINT AT(1,men_y%);cltoeol$;" Legen Sie die Diskette ";inv$;" ";diskette%;" ";norm$;" ein und drücken Sie dann eine Taste! ['x' bricht ab!,'i' invertiert] ";cur_on$;
  212.       w$=UPPER$(INPUT$(1))
  213.       PRINT cur_off$;cltoeol$
  214.       IF w$="I" THEN
  215.         ~C:invert%(L:XBIOS(2),L:153600 DIV 4)
  216.       ENDIF
  217.       IF w$="X" THEN
  218.         fehler!=TRUE
  219.       ENDIF
  220.       EXIT IF fehler!
  221.       '
  222.       ' 'Loeschen' der Diskette
  223.       IF soft_format! THEN
  224.         PRINT AT(1,men_y%);cltoeol$;" 'Lösche' die Diskette ";diskette%
  225.         IF BIOS(4,mode_write&,L:disk_anfang%,18,0,disk_drv%)<>0 THEN
  226.           ALERT 3,"Soft-Formatierung|von "+disk_drv$+"|Fehlgeschlagen",1,"ABBRUCH",dummy%
  227.           fehler!=TRUE
  228.         ENDIF
  229.       ENDIF
  230.       EXIT IF fehler!
  231.       '
  232.       ' INFO-Datei schreiben
  233.       info$=disk_drv$+":\INFO"+STR$(diskette%)+".ASC"
  234.       PRINT AT(1,men_y%);cltoeol$;" Schreibe ";info$
  235.       OPEN "O",#1,info$
  236.       PRINT #1,part_drv$;":\-Partition mit den Daten:"
  237.       FOR i%=0 TO 8
  238.         PRINT #1,bpb&(i%)
  239.       NEXT i%
  240.       PRINT #1,STRING$(25,"-")
  241.       PRINT #1,STR$(diskette%);".Diskette mit 726016 Bytes free"
  242.       PRINT #1,DATE$
  243.       PRINT #1,TIME$
  244.       CLOSE #1
  245.       dfrei%=DFREE(disk_drv%+1)
  246.       '
  247.       ' Auf Diskette 1 die kompletten Verwaltungssektoren schreiben
  248.       IF diskette%=1 THEN
  249.         gebraucht%=dat_sect&(part_drv%)*sect_size_b&(part_drv%)
  250.         IF gebraucht%>dfrei% THEN
  251.           ALERT 3,"Diskspeicherplatz|zu klein!",1,"ABBRUCH",dummy%
  252.           fehler!=TRUE
  253.         ENDIF
  254.         IF BIOS(4,mode_read&,L:kop_buf%,dat_sect&(part_drv%),0,part_drv%)<>0 THEN
  255.           ALERT 3,"Header-Sektoren|von "+disk_drv$+"|unleserlich",1,"ABBRUCH",dummy%
  256.           fehler!=TRUE
  257.         ENDIF
  258.         IF NOT fehler! THEN
  259.           PRINT AT(1,men_y%);cltoeol$;" Schreibe die ersten Sektoren mit Verwaltungsinformationen als ";header$;" auf Diskette! "
  260.           header$=disk_drv$+":\HEADER.DAT"
  261.           OPEN "O",#1,header$
  262.           BPUT #1,kop_buf%,gebraucht%
  263.           CLOSE #1
  264.         ENDIF
  265.       ENDIF
  266.       EXIT IF fehler!
  267.       '
  268.       dfrei%=DFREE(disk_drv%+1)
  269.       dat$=disk_drv$+":\CLUST"+STR$(diskette%)+".DAT"
  270.       gebraucht%=clust_size_b&(part_drv%)
  271.       dfrei%=dfrei% DIV gebraucht%
  272.       PRINT AT(1,men_y%);cltoeol$;" Schreibe die HD-Cluster in Datei ";dat$;" auf Laufwerk ";disk_drv$;" (";dfrei%;" Cluster frei)"
  273.       OPEN "O",#1,dat$
  274.       y%=CRSLIN
  275.       DO
  276.         IF BYTE{fat_buf%+cl%*2}+256*BYTE{fat_buf%+cl%*2+1}<>0 THEN ! Cluster belegt
  277.           sect%=fkt%*(cl%-2)+offset%
  278.           ~BIOS(4,mode_read&,L:kop_buf%,clust_size_s&(part_drv%),sect%,part_drv%)
  279.           PRINT AT(1,men_y%);" Cluster ";cl%;" Sektor ";sect%;" DiskFrei ";dfrei%;cltoeol$;
  280.           BPUT #1,kop_buf%,gebraucht%
  281.           DEC dfrei%
  282.         ENDIF
  283.         INC cl%
  284.         EXIT IF dfrei%<3 ! Noch 3 KB frei
  285.         EXIT IF cl%>dat_clust_anz&(part_drv%)
  286.       LOOP
  287.       CLOSE #1
  288.       PRINT
  289.       EXIT IF cl%>dat_clust_anz&(part_drv%)
  290.       '
  291.     LOOP
  292.   ENDIF
  293.   IF fehler! THEN
  294.     PRINT beep$;
  295.     ALERT 3,"Daten auf|Diskette "+disk_drv$+":|ungültig!",1,"WEITER",dummy%
  296.     PRINT beep$;
  297.   ENDIF
  298. RETURN ! hard_to_disk
  299. > PROCEDURE disk_to_hard
  300.   LOCAL diskette%,fehler!,i%,w$,info$,h$,t$,d$,cl%,l%,header$,sectors%,offset%,fadr%,flen%,dat$,gebraucht%,clusters%,y%,cl%,sector%,fkt%
  301.   '
  302.   fehler!=FALSE
  303.   diskette%=0
  304.   offset%=dat_sect&(part_drv%)
  305.   fkt%=clust_size_s&(part_drv%)
  306.   cl%=1
  307.   h$=""
  308.   w$=""
  309.   '
  310.   DO
  311.     '
  312.     INC diskette%
  313.     PRINT AT(1,men_y%);cltoeol$;" Legen Sie die Diskette ";inv$;" ";diskette%;" ";norm$;" ein und drücken Sie eine Taste! ['x' bricht ab, 'i' invertiert] ";cur_on$;
  314.     w$=UPPER$(INPUT$(1))
  315.     PRINT cur_off$;cltoeol$
  316.     IF w$="I" THEN
  317.       ~C:invert%(L:XBIOS(2),L:153600 DIV 4)
  318.     ENDIF
  319.     IF w$="X" THEN
  320.       fehler!=TRUE
  321.     ENDIF
  322.     EXIT IF fehler!
  323.     '
  324.     info$=disk_drv$+":\INFO"+STR$(diskette%)+".ASC"
  325.     IF NOT EXIST(info$) THEN
  326.       ALERT 3,"Falsche Diskette?|'"+info$+"'|Fehlt!",1,"ABBRUCH",dummy%
  327.       fehler!=TRUE
  328.     ENDIF
  329.     EXIT IF fehler!
  330.     '
  331.     PRINT AT(1,men_y%);cltoeol$;" Überprüfe Daten anhand von ";info$
  332.     OPEN "I",#1,info$
  333.     LINE INPUT #1,h$
  334.     h$=LEFT$(h$,1)
  335.     IF h$<>part_drv$ THEN
  336.       ALERT 3,"Falsche Partition!|Disk:"+h$+"|HD:"+part_drv$,1,"ABBRUCH",dummy%
  337.       fehler!=TRUE
  338.     ENDIF
  339.     IF NOT fehler! THEN
  340.       FOR i%=0 TO 8
  341.         LINE INPUT #1,h$
  342.         dbpb&(i%)=VAL(h$)
  343.         IF dbpb&(i%)<>bpb&(i%) THEN
  344.           ALERT 3,bpb_bez$(i%)+"|unterschiedlich!",1,"ABBRUCH",dummy%
  345.           fehler!=TRUE
  346.         ENDIF
  347.       NEXT i%
  348.     ENDIF
  349.     IF NOT fehler! THEN
  350.       LINE INPUT #1,h$
  351.       LINE INPUT #1,h$
  352.       IF VAL(h$)<>diskette% THEN
  353.         ' ALERT 3,"Falsche Zählung|INTERNER Fehler!",1,"ABBRUCH",dummy%
  354.         ' fehler!=TRUE
  355.       ENDIF
  356.     ENDIF
  357.     IF NOT fehler! THEN
  358.       LINE INPUT #1,h$
  359.       IF diskette%=1 THEN
  360.         t$=h$
  361.       ELSE
  362.         IF h$<>t$ THEN
  363.           ' ALERT 3,"Diskette aus|ANDERER|Zeitreihe!",1,"ABBRUCH",dummy%
  364.           ' fehler!=TRUE
  365.         ENDIF
  366.       ENDIF
  367.     ENDIF
  368.     IF NOT fehler! THEN
  369.       LINE INPUT #1,h$
  370.       IF diskette%=1 THEN
  371.         d$=h$
  372.       ELSE
  373.         IF h$<>t$ THEN
  374.           ' ALERT 3,"Diskette aus|ANDERER|Datumsreihe!",1,"ABBRUCH",dummy%
  375.           ' fehler!=TRUE
  376.         ENDIF
  377.       ENDIF
  378.     ENDIF
  379.     h$=""
  380.     CLOSE #1
  381.     EXIT IF fehler!
  382.     '
  383.     '
  384.     IF diskette%=1 THEN
  385.       header$=disk_drv$+":\HEADER.DAT"
  386.       IF EXIST(header$) THEN
  387.         PRINT AT(1,men_y%);cltoeol$;" Lese die Verzeichnis-Daten der ersten Sektoren aus ";header$
  388.         OPEN "I",#1,header$
  389.         l%=LOF(#1)
  390.         BGET #1,kop_buf%,l%
  391.         CLOSE #1
  392.         sectors%=l% DIV sect_size_b&(part_drv%)
  393.         IF sectors%<>offset% THEN
  394.           ALERT 3,"Headerlänge falsch|Disk:"+STR$(sectors%)+"|HD:"+STR$(offset%),1,"ABBRUCH",dummy%
  395.           fehler!=TRUE
  396.         ELSE
  397.           ' GOTO debug
  398.           IF BIOS(4,mode_write&,L:kop_buf%,sectors%,0,part_drv%)<>0 THEN
  399.             ALERT 3,"Verzeichnis|nicht beschreibbar!",1,"ABBRUCH",dummy%
  400.             fehler!=TRUE
  401.           ENDIF
  402.         debug:
  403.         ENDIF
  404.       ELSE
  405.         ALERT 3,header$+"|fehlt!",1,"ABBRUCH",dummy%
  406.         fehler!=TRUE
  407.       ENDIF
  408.     ENDIF
  409.     EXIT IF fehler!
  410.     '
  411.     ' FAT einlesen
  412.     fadr%=kop_buf%+fat2_sect&(part_drv%)*sect_size_b&(part_drv%)
  413.     flen%=fat_size_s&(part_drv%)*sect_size_b&(part_drv%)
  414.     BMOVE fadr%,fat_buf%,flen%
  415.     IF LPEEK(fat_buf%)<>&HF8FFFFFF THEN
  416.       ALERT 3,"FAT in|Unordnung!",1,"ABBRUCH",dummy%
  417.       fehler!=TRUE
  418.     ENDIF
  419.     EXIT IF fehler!
  420.     '
  421.     dat$=disk_drv$+":\CLUST"+STR$(diskette%)+".DAT"
  422.     IF EXIST(dat$) THEN
  423.       OPEN "I",#1,dat$
  424.       l%=LOF(#1)
  425.       gebraucht%=clust_size_b&(part_drv%)
  426.       clusters%=l% DIV gebraucht%
  427.       PRINT AT(1,men_y%);cltoeol$;" Lese ";clusters%;" Cluster aus ";dat$;" ein."
  428.       y%=CRSLIN
  429.       DO
  430.         BGET #1,kop_buf%,gebraucht%
  431.         DEC clusters%
  432.         REPEAT
  433.           INC cl%
  434.         UNTIL BYTE{fat_buf%+cl%*2}+256*BYTE{fat_buf%+cl%*2+1}<>0 ! OR cl%>dat_clust_anz&(part_drv%)
  435.         ' EXIT IF cl%>dat_clust_anz&(part_drv%)
  436.         sector%=offset%+fkt%*(cl%-2)
  437.         PRINT AT(1,men_y%);" Cluster ";cl%;" Sektor ";HEX$(sector%);" Rest-Cluster ";clusters%;" ";
  438.         ' GOTO hallo
  439.         IF BIOS(4,mode_write&,L:kop_buf%,clust_size_s&(part_drv%),sector%,part_drv%)<>0 THEN
  440.           ALERT 3,"Cluster ließ|sich nicht|schreiben!",1,"ABBRUCH",dummy%
  441.           fehler!=TRUE
  442.         ENDIF
  443.       hallo:
  444.         EXIT IF clusters%=0 OR fehler!
  445.       LOOP
  446.       PRINT
  447.       CLOSE #1
  448.     ELSE
  449.       ALERT 3,dat$+"|Nicht gefunden!",1,"ABBRUCH",dummy%
  450.       fehler!=TRUE
  451.     ENDIF
  452.     '
  453.   LOOP
  454.   '
  455. RETURN ! disk_to_hard
  456. '
  457. > PROCEDURE schluss
  458.   SPOKE &H444,1 ! Verify!
  459. RETURN ! schluss
  460. '
  461.